package com.lagou.server;

import com.lagou.model.User;

import java.io.*;
import java.util.*;

// 自定义一个管理器，负责管理所有学员的信息；
public class UserInfoManager {

    // 所有学员信息，用集合来维护--可以map 可以list
    private Map<String, User> users = new HashMap<>();
    private String saveUsersPath = "/home/keats/test/userMap.txt"; // windows下 d:\\test\\userMap.txt

    public UserInfoManager() {
        loadUserFromFile();
    }

    // 自定义学员的增删查改，管理的个体是User
    boolean addUser(User user) {
        // 检查数据有效性，且不存在该名字对应的学生
        if(null != user && user instanceof User
                && !users.containsKey(user.getUserName())) {
            users.put(user.getUserName(), user);
            System.out.println("服务器添加学员" + user.getUserName() + "成功");
            return true;
        }
        System.out.println("数据有误，或已存在" +user.getUserName() + "学员信息"); // 是否需要抛出什么消息，回复客户端
        return false;
    }

    boolean deleteUser(String userName) {
        if(users.containsKey(userName)) {
            User user = users.remove(userName);
            System.out.println("成功删除学员：" + user );
            return true;
        }
        System.out.println("不存在" + userName + "用户名对应的学员");
        return false;
    }

    User findUser(String userName) {
        if(users.containsKey(userName)) {
            User user = users.get(userName);
            return user;
        }
        System.out.println("不存在" + userName + "用户名对应的学员");
        return null;
    }

    // 指定学员名，修改密码
    boolean updateUser(String userName, User user) {
        // 检查数据有效性，且存在该名字对应的学生
        if(null != user && user instanceof User
                && users.containsKey(userName)) {
            users.put(userName, user);
            System.out.println("服务器修改学员" + userName + "信息成功");
            return true;
        }

        System.out.println("不存在" + userName + "用户名对应的学员");
        return false;
    }

    /**
     * 从文件读取学员信息
     */
    private void loadUserFromFile() {
        ObjectInputStream ois = null;
        try {
            // 1.创建ObjectInputStream类型对象和文件关联

            FileInputStream fileInputStream = new FileInputStream(saveUsersPath);
            ois = new ObjectInputStream(fileInputStream);

            // 2.从输入流中读取一个对象
            Object obj = ois.readObject();
            System.out.println("读取到的学员信息是：" + obj);
            if(obj instanceof Map)
            {
                Map tmpArrayList = (Map) obj;
                // 获取Map集合中所有键值对并组成Set视图
                Set<Map.Entry<String, User>> entries = tmpArrayList.entrySet();
                for (Map.Entry<String, User> me : entries) {
                    System.out.println("数据库读取到学员信息：" + me);
                    users.put(me.getKey(), me.getValue());
                }
                System.out.println("读取数据库，添加完数据之后，所有学员数量为：" + users.size());
            }

        } catch (FileNotFoundException e) {
            System.out.println("数据库文件不存在！");
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 3.关闭对象并释放有关资源
            if (null != ois) {
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 保存学员信息到文件中
     */
    public void saveUserTofile() {
        ObjectOutputStream oos = null;
        try {
            // 1.创建ObjectOutputStream类型对象和文件关联
            oos = new ObjectOutputStream(new FileOutputStream(saveUsersPath));

            // 2.准备一个对象 arrayList ArrayList类型
            // 3.将整个User类型对象写入输出流
            oos.writeObject(users);
            System.out.println("保存了" + users.size() + "个学员数据");
            System.out.println("写入集合对象（序列化）成功！");
        } catch (IOException e) {
            e.printStackTrace(); // NotSerializableException 可能报这个异常
        } finally {
            // 4.关闭流对象并释放有关的资源
            if (null != oos) {
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /*public static void main(String[] args) {
        UserInfoManager uim = new UserInfoManager();
        uim.addUser(new User("zhangfei", "1234567"));
        uim.deleteUser("zhangfei");
        uim.addUser(new User("zhangfei", "1234567"));
        uim.addUser(new User("guanyu", "1234567"));
        System.out.println(uim.findUser("guanyu"));
        uim.updateUser("guanyu", new User("guanyu", "12345678"));
        uim.saveUserTofile();
    }*/
}
